package com.dys.testabstractclass;

/**
 * @className: com.dys.testabstractclass.AbstractPerson
 * @description: 抽象类: 可以定义0-n个抽象方法
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/07/21 下午9:16
 */
public abstract class AbstractPerson {
    // 子类对父类提供的方法永远满意，不用重写
    public void eat() {
        System.out.println("吃饭的方法...");
    }

    public abstract void say();

    public abstract void sleep();
}

class Student extends AbstractPerson {

    @Override
    public void say() {
        System.out.println("子类对父类的方法不满意，所以重写...");
    }

    @Override
    public void sleep() {
        System.out.println("子类重写父类的抽象方法...");
    }
}

class Test {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) {
        // 1.抽象类无法被实例化
        // AbstractPerson abstractPerson = new AbstractPerson();
        // 2.抽象类不能被final修饰，抽象类设计的初衷就是给子类定义模板的,避免了子类设计的随意性
        // 3.抽象类有构造器
        // 4.创建子类对象
        Student student = new Student();
        student.eat();
        student.sleep();
    }
}